'''
Created on 03/06/2013

@author: mirta
'''
import unittest
from app import app

from test_helper import login
from test_helper import get_id_when_radio_exist

from app.models.usuario import Usuario

#ID_USUARIO = '2'
USUARIO = Usuario.query.filter_by(nombre='usu_1').first()
ID_USUARIO = USUARIO.id

class TestCase(unittest.TestCase):
    """
    Clase que implementa los test para el caso de uso Proyecto.
    Utilizamos esta clase para realizar las pruebas de nuestra aplicacion SAP
    """
    
    def setUp(self):
        """
        se llama a este metodo antes de iniciar el test de la aplicacion
        , este metodo crea un nuevo cliente de prueba.
        Se especifican las acciones a ser tomadas antes de iniciar el test
        """
        
        print "Iniciando test"
        #self.db_fd, app.config['DATABASE'] = tempfile.mkstemp()
        self.app = app.test_client()
        self.acceso = login(self.app)
       

    def tearDown(self):
        """
        se llama a este metodo al terminar el test el test de la aplicacion,
        en el se especifican las acciones a ser tomadas al finalizar el test
        """
        print "Terminando test"


    def test_get_all_proyectos(self):
        """
        Controla que se pueda acceder a los proyectos
        """
        request = self.app.get('/proyecto/administracion/', follow_redirects=True)
        #assert 'Administrador' in request.data
        self.assertEqual(request._status, '200 OK')
   
   
    def test_crear_proyecto(self):
        """
        Controla que se puede crear un proyecto, y luego verifica si el proyecto fue 
        anhadido.
        """
        
        print "Probando crear un proyecto"
        request = self._crear_proyecto(nombre='test proyecto', presupuesto='2000', lideres=ID_USUARIO)
     
        print "Respuesta satisfactoria, verificando si creo el proyecto"
        request_all = self.app.get('/proyecto/administracion/', follow_redirects=True)
        assert 'test proyecto' in request_all.data
        print "Proyecto creado correctamente"

            
    def test_eliminar_proyecto(self):
        """
        Test que verifica si se puede eliminar un proyecto
        """
        print "Creando proyecto con nombre 'test proyecto2'."
        crear_request = self._crear_proyecto(nombre='test proyecto2', presupuesto='2000', lideres=ID_USUARIO)
        print "Verificando si se creo el proyecto"
        all_request = self._get()
        assert 'test proyecto2' in all_request.data
        print "Proyecto creado exitosamente"
        _id = get_id_when_radio_exist(all_request, 'test proyecto2')
        path = 'proyecto/eliminar/{0}/'.format(_id)
        #print "------------------------------"
        #print path
        borrar_request = self._get(path)
        #print borrar_request.data
        assert 'Se ha eliminado el proyecto exitosamente' in borrar_request.data
        
    
    def test_consultar_proyecto(self):
        """
        Test que verifica si se puede consultar un proyecto
        """
        print "Creando proyecto con nombre 'test atributo2'."
        crear_request = self._crear_proyecto(nombre='test proyecto3', presupuesto='2000', lideres=ID_USUARIO)
        print "Verificando si se creo el proyecto"
        all_request = self._get()
        assert 'test proyecto3' in all_request.data
        print "Proyecto creado exitosamente"
        _id = get_id_when_radio_exist(all_request, 'test proyecto3')
        path = 'proyecto/consultar/{0}/'.format(_id)
        #print "------------------------------"
        #print path
        borrar_request = self._get(path)
        #print borrar_request.data
        assert 'Consulta de Proyecto' in borrar_request.data
    
    
    def test_seleccionar_miembros(self):
        all_request = self._get()
        assert 'test proyecto' in all_request.data
        print "Proyecto creado exitosamente"
        _id = get_id_when_radio_exist(all_request, 'test proyecto')
        path = 'proyecto/seleccionar/{0}/'.format(_id)
        #print "------------------------------"
        #print path
        borrar_request = self._get(path)
        #print borrar_request.data
        assert 'Seleccionar miembros para el proyecto' in borrar_request.data
        self._seleccionar_miembros(path, miembros=ID_USUARIO)
        borrar_request = self._get(path)
        #print borrar_request.data
        #assert 'Se ha eliminado el proyecto exitosamente' in borrar_request.data
        #assert 'Se ha actualizado con exito los datos de miembros para el proyecto seleccionado' in borrar_request.data
                
                
    def _crear_proyecto(self, nombre='test proyecto', presupuesto='2000', lideres=ID_USUARIO):
        """
        Metodo para crear un proyecto, lo crea y retorna la respuesta
        @param nombre: nombre del nuevo proyecto
        @param presupuesto: presupuesto estimado del nuevo proyecto
        @param lideres: id del lider del nuevo proyecto
        """
        request = self.app.post('/proyecto/crear/', data=dict(
            nombre=nombre,
            presupuesto=presupuesto,
            lideres=lideres), follow_redirects=True)
        return request


    def _seleccionar_miembros(self, path, miembros=ID_USUARIO):
        request = self.app.post(path, data=dict(
            miembros=miembros), follow_redirects=True)
        return request
    
    
    def _get(self, url ='/proyecto/administracion/'):
        """
        Metodo que obtiene la pagina de administracion de proyectos
        @param url: url de la pagina de administracion de proyectos
        """
        return self.app.get(url, follow_redirects=True)
    

        
if __name__ == '__main__':
    unittest.main()